package main

import (
	"context"
	"fmt"
	"time"
)

func worker(ctx context.Context, id int) {
	for {
		select {
		case <-ctx.Done():
			// 当上下文被取消时，停止工作
			fmt.Printf("Worker %d: Stopping\n", id)
			return
		default:
			// 模拟工作
			fmt.Printf("Worker %d: Working\n", id)
			time.Sleep(1 * time.Second)
		}
	}
}

func main() {
	// 创建一个根上下文
	ctx := context.Background()

	// 派生两个子上下文，每个子上下文控制一个 goroutine
	childCtx1, cancel1 := context.WithCancel(ctx)
	childCtx2, cancel2 := context.WithCancel(ctx)

	// 启动两个 goroutine
	go worker(childCtx1, 1)
	go worker(childCtx2, 2)

	// 主程序休眠一段时间后，取消一个子上下文
	time.Sleep(3 * time.Second)
	cancel1()

	// 主程序继续休眠一段时间后，取消另一个子上下文
	time.Sleep(3 * time.Second)
	cancel2()

	// 主程序继续休眠一段时间，观察输出
	time.Sleep(2 * time.Second)
}
